package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import model.*;


public abstract class APPrenda {

	
	
	public static Prenda buscarPrendaActiva(int prendaId) {
		Prenda i = null;
		Vector<ItemMaterial> items = new Vector<ItemMaterial>();
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia select
			items = buscarMaterialesEnPrenda(prendaId);
			String senten = "SELECT * FROM Ropa where estado = 1 and  idRopa = ? and tipoDeRopa in ('DeTemporada','SinTemporada')";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, prendaId);
			ResultSet result = ps.executeQuery();
			
			while (result.next()) {
				if(result.getString("tipoDePrenda").equalsIgnoreCase("DeTemporada"))
					i = new DeTemporada(result.getString("nombre"), result.getInt("prendaId"), result.getString("estacionanio"), items, result.getFloat("precio"));
				else
					i = new SinTemporada(result.getInt("prendaId"), result.getString("nombre"), items, result.getFloat("precio"));					
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);
			return i;
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscarPrendaActiva: " + e.getMessage());
			System.out.println("Stack Trace al buscarPrendaActiva: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return null;
	}
	
	
	public static Vector<ItemMaterial> buscarMaterialesEnPrenda(int prendaId) {
		Vector<ItemMaterial> items = new Vector<ItemMaterial>();
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			String senten = "select m.idMaterial, m.nombre, m.puntoPedido, m.costo, m.stock, m.idProveedor, mp.cantidad from Material_Ropa mp JOIN Material m  on m.idMaterial = mp.idMaterial where mp.idRopa = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, prendaId);
			ResultSet result = ps.executeQuery();
			
			while (result.next()) {
				items.add(new ItemMaterial(new Material (result.getInt("idMaterial"), result.getString("nombre"), result.getInt("puntoPedido"), result.getFloat("costo"), result.getInt("stock"),result.getInt("idProveedor")), result.getInt("cantidad")));						
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);
			return items;
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscarMaterialesEnPrenda: " + e.getMessage());
			System.out.println("Stack Trace al buscarMaterialesEnPrenda: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return null;
	}


	public static Prenda buscarPrenda(String nombre) {
		Prenda i = null;
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia select
			String senten = "SELECT * FROM Ropa where nombre = ? and tipoDeRopa in ('DeTemporada','SinTemporada')";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, nombre);
			ResultSet result = ps.executeQuery();
			while (result.next()) {
				if(result.getString("tipoDeRopa").equalsIgnoreCase("DeTemporada"))
					i = new DeTemporada(result.getString("nombre"), result.getInt("idRopa"), result.getString("estacionanio"), buscarMaterialesEnPrenda(result.getInt("idRopa")), result.getFloat("precio"));
				else
					i = new SinTemporada(result.getInt("idRopa"), result.getString("nombre"), buscarMaterialesEnPrenda(result.getInt("idRopa")), result.getFloat("precio"));					
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);
			return i;
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscar prenda por nombre: " + e.getMessage());
			System.out.println("Stack Trace al buscar prenda por nombre: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return null;
	}


	public static Prenda buscarPrenda(int prendaId) {
		Prenda i = null;
		Vector<ItemMaterial> items = new Vector<ItemMaterial>();
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia select
			items = buscarMaterialesEnPrenda(prendaId);
			String senten = "SELECT * FROM Ropa where idRopa = ? and tipoDeRopa in ('DeTemporada','SinTemporada')";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, prendaId);
			ResultSet result = ps.executeQuery();
			
			while (result.next()) {
				if(result.getString("tipoDeRopa").equalsIgnoreCase("DeTemporada"))
					i = new DeTemporada(result.getString("nombre"), result.getInt("idRopa"), result.getString("estacionanio"), items, result.getFloat("precio"));
				else
					i = new SinTemporada(result.getInt("idRopa"), result.getString("nombre"), items, result.getFloat("precio"));					
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);
			return i;
		} catch (SQLException e) {
			System.out.println("Mensaje Error al Buscar Prenda por codigo: " + e.getMessage());
			System.out.println("Stack Trace al Buscar Prenda por codigo: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return null;
	}
	
	
	public static void borrarAPPrenda(int prendaId) {
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino	
			String senten = "UPDATE Ropa SET estado = 0 where idRopa= ? and tipoDeRopa in ('DeTemporada','SinTemporada')";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, prendaId);
			ps.execute();

			AdministradorConexiones.getInstancia().cerrarConexion(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al borrarAPPrenda: " + e.getMessage());
			System.out.println("Stack Trace al borrarAPPrenda: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
	}

	
	
	public static Vector<Prenda> getPrendasActivos() {
	// Obtener conexion BD
	Prenda pren = null;
	Vector <Prenda > prendasActivas = new Vector<Prenda>();
	Connection con = AdministradorConexiones.getInstancia().crearConexion();

	// Generar sentencia SQL
	try {
		// Preparar sentencia insert en tabla destino	
		String senten = "SELECT * FROM Ropa where estado = 1 and tipoDeRopa in ('DeTemporada','SinTemporada')";
		PreparedStatement ps = null;
		ps = con.prepareStatement(senten);
		ResultSet result = ps.executeQuery();
		while(result.next())
		{
			if(result.getString("tipoDeRopa").equalsIgnoreCase("DeTemporada")){
				pren = new DeTemporada(result.getString("nombre"), result.getInt("idRopa"),result.getString("estacionanio"),buscarMaterialesEnPrenda(result.getInt("idRopa")),result.getFloat("precio"));
			}
			else{
				pren = new SinTemporada(result.getInt("idRopa"), result.getString("nombre"),buscarMaterialesEnPrenda(result.getInt("idRopa")),result.getFloat("precio"));

			}
			prendasActivas.add(pren);
		}

		AdministradorConexiones.getInstancia().cerrarConexion(con);

		return prendasActivas;	
	} catch (SQLException e) {
		System.out.println("Mensaje Error al getPrendasActivas: " + e.getMessage());
		System.out.println("Stack Trace al getPrendasActivas: " + e.getStackTrace());
		AdministradorConexiones.getInstancia().cerrarConexion(con);
	}
	return null;
	}
	
	
}
